www.gusucode.com > C++ 游戏类库源码程序 > C++ 游戏类库源码程序\code\游戏类库\game_寻路.cpp
/* [学VC、编游戏] 编著、程序设计:唐明理 2004.7 E-mail: cqtml@163.com */ #include "stdafx.h" #include "game_寻路.h" extern unsigned short dw[7][6]; gamepro:: gamepro(){} gamepro::~gamepro(){} void gamepro::lookit(int i) { if(man[i].lb!=0) return; for(int q=0;q<rs;q++) {if(q==i) continue; if(man[q].lb==2) continue; int x=man[i].xix-man[q].xix; int y=man[i].xiy-man[q].xiy; if(abs(x)<man[q].w && abs(y)<man[q].h) { if(man[i].lb!=man[q].lb) { man[q].x0=man[q].fx=man[q].xix;// man[q].y0=man[q].fy=man[q].xiy;// man[q].fid=man[q].pk; if(x==0&&y<0) {man[i].fw=0;man[q].fw=4;} if(x>0&&y< 0) {man[i].fw=1;man[q].fw=5;} if(x>0&&y==0) {man[i].fw=2;man[q].fw=6;} if(x>0&&y> 0) {man[i].fw=3;man[q].fw=7;} if(x==0&&y>0) {man[i].fw=4;man[q].fw=0;} if(x<0&&y> 0) {man[i].fw=5;man[q].fw=1;} if(x<0&&y==0) {man[i].fw=6;man[q].fw=2;} if(x<0&&y< 0) {man[i].fw=7;man[q].fw=3;} man[q].zs=dw[man[q].js][3];man[q].zd=1; man[i].zs=3; man[i].zd=1; if(man[i].p==man[i].m1-2) sndPlaySound("砍1.wav",SND_ASYNC); if(man[q].p==man[q].m1-8) sndPlaySound("羊.wav",SND_ASYNC); break; } } } } void gamepro::randxy() { for(int q=0;q<rs;q++) {if(fidf==TRUE) return; if(rand()%20>0) continue; if(man[q].lb!=1||man[q].fid<man[q].pk) continue; if(man[q].zd==1) continue; int x=man[q].x0+WIDTH/2-rand()%WIDTH; int y=man[q].y0+HEIGHT/2-rand()%HEIGHT; if(x<GX) x=GX; if(y<GY) y=GY; if(x>WIDTH *SCRP0-GX) x=WIDTH *SCRP0-GX; if(y>HEIGHT*SCRP0-GY) y=HEIGHT*SCRP0-GY; if(FindPath(q,x,y)<0) continue; man[q].p=man[q].m1-1; } } int gamepro::FindPath(int i,int x,int y) { if(find_p==0) return 0; if(fidf==TRUE) return -4; if(x<=0||y<=0) return -3; int x0=x/GX,y0=y/GY; if(m_fid.map[x0][y0]=='1') {fidf=FALSE;return -1;} if(x0==man[i].xix/GX&&y0==man[i].xiy/GY) {fidf=FALSE;return -2;} if(x0<1||y0<1) {fidf=FALSE;return -10;} if((x0+1)>=WIDTH*SCRP0/GX||(y0+1)>=HEIGHT*SCRP0/GY) {fidf=FALSE;return -20;} fidf=TRUE; int tim=timeGetTime(); m_fid.end_y =man[i].xix/GX; m_fid.end_x =man[i].xiy/GY; m_fid.start_y=x0; m_fid.start_x=y0; if(m_fid.findpath()==-1) {fidf=FALSE; return-1; } man[i].pk=zlpath(); if(man[i].pk<0) {fidf=FALSE;return -3;} if(man[i].pk>250) {man[i].pk=0;fidf=FALSE;return -5;} for(int j=0;j<man[i].pk;j++) man[i].ph[j]=pathn[j]; man[i].fx=x;man[i].fy=y; man[i].fid=1; if(man[i].pk>1) {man[i].x0=man[i].ph[man[i].fid].x*GX+man[i].w/2; man[i].y0=man[i].ph[man[i].fid].y*GY+man[i].h/2; man[i].fid++; } fidf=FALSE; return timeGetTime()-tim; } int gamepro::zlpath() { int k=1; int yy0; int xx=m_fid.path[0]/m_fid.map_w; int yy=m_fid.path[0]%m_fid.map_w; pathn[0].x=xx;pathn[0].y=yy; for(int j=1;m_fid.path[j]>0;j++) {xx= m_fid.path[j]/m_fid.map_w; yy= m_fid.path[j]%m_fid.map_w; yy0=m_fid.path[j+1]%m_fid.map_w; pathn[k].x=xx;pathn[k].y=yy; if(yy!=yy0) k++; if(k>500) return -1; } int p=1; for(j=1;j<k;j++) {pathn[p].x=pathn[j].x;pathn[p].y=pathn[j].y; if(pathn[j].x!=pathn[j+1].x) p++; } return p; } void gamepro::loadza(CString name) { char cc[256]; FILE *f; int i,j; strcpy(cc,name);cc[lstrlen(name)-3]=0; strcat(cc,"map"); f=fopen(cc,"r"); if(f==NULL) goto aa; fscanf(f,"%d,%d\n",&w,&h); SCRP0=w/16; m_fid.map_w=WIDTH*SCRP0/GX; m_fid.map_h=HEIGHT*SCRP0/GY; if(w>WIDTH*SCRP/GX||h>HEIGHT*SCRP/GY) {SetCurrentDirectory(appdir); return; } for(i=0;i<h;i++) fgets(&m_fid.map[i][0],w+2,f); fclose(f); aa:for(i=0;i<m_fid.map_w;i++) for(j=0;j<m_fid.map_h;j++) if(m_fid.map[i][j]!='1') m_fid.map[i][j]='0'; find_p=1; SetCurrentDirectory(appdir); } void gamepro::loaddata() { FILE *f; int len,i,j; CString cc; cc=dir+"景.dar"; f=fopen(cc,"r"); if(f==NULL) return; fscanf(f,"%d",&len); for(i=0;i<len;i++) fscanf(f,"%d,%d,%d",&jbufadd[i],&j,&j); fclose(f); cc=dir+"兽.dar"; f=fopen(cc,"r"); if(f==NULL) return; fscanf(f,"%d",&len); for(i=0;i<len;i++) fscanf(f,"%d,%d,%d",&sbufadd[i],&sbufx[i],&sbufy[i]); fclose(f); cc=dir+"人.dar"; f=fopen(cc,"r"); if(f==NULL) return; fscanf(f,"%d",&len); for(i=0;i<len;i++) fscanf(f,"%d,%d,%d",&rbufadd[i],&rbufx[i],&rbufy[i]); fclose(f); // B、...... cc=dir+"兽.gam"; if( !sfile.Open(cc, CFile::modeRead, NULL ) ) return; cc=dir+"人.gam"; if( !rfile.Open(cc, CFile::modeRead, NULL ) ) return; cc=dir+"景.gam"; if( !jfile.Open(cc, CFile::modeRead, NULL ) ) return; UINT len0=sfile.GetLength(); stmp=(BYTE *)new BYTE[len0]; sfile.Read( stmp, len0); sfile.Close(); len0=rfile.GetLength(); rtmp=(BYTE *)new BYTE[len0]; rfile.Read( rtmp, len0); rfile.Close(); len0=jfile.GetLength(); jtmp=(BYTE *)new BYTE[len0]; jfile.Read( jtmp, len0); jfile.Close(); } int gamepro::leftdown(HDC hdc,int x,int y) { int fidtim=0; if(find_p==0) {gamemap::leftdown(hdc,x,y); return fidtim; } if(x>0&&x<WIDTH&&y>0&&y<HEIGHT&&edi==0) {int i=mann; fidtim=FindPath(i,x-2+scrx,y-10+scry); man[i].p=man[i].m1-1; } if(dingweimap(x,y)==TRUE) smlmap(hdc); return fidtim; }